package cn.cloud.mqtt2redis.controller;

import cn.cloud.mqtt2redis.service.RedisService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
//解析probe文件，Probe/Query/Response/DEVICEID,
public class JsonProbe {
    private Logger logger = LoggerFactory.getLogger(getClass());
    //private Map<String , String> hashMap = new HashMap<>();
    @Autowired
    private RedisService redisService;

	
    public void parse_probe_devices(){}

    private void parse_probe_version(String machineID, Object probe_version) {
        //linkedHashMap.put("VERSION",probe_version.toString());
        redisService.set_version_to_redis(machineID,probe_version.toString());
    }

    public void parse_probe_configs(String machineID,JSONArray json_configs){
        for(int index=0;index<json_configs.size();index++){
            if("sample_channel1".equals(json_configs.getJSONObject(index).get("id"))){
                redisService.set_SampleChannel_ids_to_redis(machineID,json_configs.getJSONObject(index).getJSONArray("ids"));
                break;
            }
        }
    }

    public void parse_probe_dataItems(String machineID,JSONArray json_devices_dataItem){
        Map<String , String> linkedHashMap  = Maps.newLinkedHashMap();
        for(int index=0;index<json_devices_dataItem.size();index++){
            linkedHashMap.put(json_devices_dataItem.getJSONObject(index).getString("type"),
                    json_devices_dataItem.getJSONObject(index).getString("id"));
        }
        redisService.set_dataItem_id_to_redis(machineID,linkedHashMap);
    }
    public void parse_probe_components(String machineID,JSONArray json_components) {

        for (int index = 0; index < json_components.size(); index++) {
            //解析components类型
            String component_type = json_components.getJSONObject(index).getString("type");

            if ("CONTROLLER".equals(component_type)) {
                Map<String , String> linkedHashMap  = Maps.newLinkedHashMap();
                //解析components的config
                JSONArray json_components_config = json_components.getJSONObject(index).getJSONArray("configs");
                for (int index_config = 0; index_config < json_components_config.size(); index_config++) {
                    linkedHashMap.put(json_components_config.getJSONObject(index_config).getString("type"),
                            json_components_config.getJSONObject(index_config).getString("id"));
                }
                //解析components的dataItems
                JSONArray json_components_dataItems = json_components.getJSONObject(index).getJSONArray("dataItems");
                for (int index_dataItems = 0; index_dataItems < json_components_dataItems.size(); index_dataItems++) {
                    JSONObject json_components_dataItems_index = json_components_dataItems.getJSONObject(index_dataItems);
                    if (json_components_dataItems_index.containsKey("number")) {
                        linkedHashMap.put(json_components_dataItems_index.getString("type") + "#" + json_components_dataItems_index.getString("number"),
                                json_components_dataItems_index.getString("id"));
                    } else {
                        linkedHashMap.put(json_components_dataItems_index.getString("type"), json_components_dataItems_index.getString("id"));
                    }
                }
                redisService.set_component_controller_to_redis(machineID,linkedHashMap);
            }else if("AXIS".equals(component_type)){
                Map<String , String> linkedHashMap  = Maps.newLinkedHashMap();
                String component_number = json_components.getJSONObject(index).getString("number");
                JSONArray json_components_component = json_components.getJSONObject(index).getJSONArray("components");
                for(int index_component=0;index_component<json_components_component.size();index_component++){
                    String field = component_type+"#"+component_number+"#"+json_components_component.getJSONObject(index_component).getString("type");
                    JSONArray json_components_component_dataItem = json_components_component.getJSONObject(index_component).getJSONArray("dataItems");
                    for(int index_component_dataItem=0;index_component_dataItem<json_components_component_dataItem.size();index_component_dataItem++){
                        JSONObject Object = json_components_component_dataItem.getJSONObject(index_component_dataItem);
                        if(Object.containsKey("commanded")){
                            linkedHashMap.put(field+"#"+Object.getString("type")+"#"+Object.getString("commanded"),
                                    Object.getString("id"));
                        }else {
                            linkedHashMap.put(field + "#" + Object.getString("type"),Object.getString("id"));
                        }
                    }
                }
                redisService.set_component_axit_to_redis(machineID,linkedHashMap);
            }
        }
    }

    public void parse_model_probe(String topic, JSONObject message){
        if(!message.containsKey("code") || !"OK".equalsIgnoreCase(message.getString("code"))) return;
        try {
            Map<String , String> linkedHashMap  = Maps.newLinkedHashMap();;
            //获取DEVICEID
            String tmp[] = topic.split("/");
            String machineID = tmp[tmp.length-1];
            //从message响应中解析中probe文件数据：message.getJSONObject("probe")
            JSONObject json_probe = message.getJSONObject("probe").getJSONArray("devices").getJSONObject(0);
            //解析probe_version
            redisService.set_version_to_redis(machineID,json_probe.getString("version"));
            //解析config
            parse_probe_configs(machineID,json_probe.getJSONArray("configs"));
            //解析dataItems
            parse_probe_dataItems(machineID,json_probe.getJSONArray("dataItems"));
            //解析components
            parse_probe_components(machineID,json_probe.getJSONArray("components"));

            //redisService.set_progid_to_redis(machineID,linkedHashMap);
            redisService.set_realMachineID_to_redis(machineID);
        }catch (Exception e){
            logger.error("error:parse probe-"+topic+";\n"+e);
            logger.info(message.toString());
        }
    }


}
